#include"logger.h"
#include<stdlib.h>
#include"public.h"
#include<iostream>
/* 可通过环境变量来设置当前日志记录的最低级别 */
Logger::Logger()
    : m_logToTerminal(true), m_logToLogFile(false)
{
    /* 初始化m_level */
    if(nullptr == getenv("LOG_LEVEL"))
    {
        m_level = INFO; //如果环境变量中没有默认级别信息，则设置默认级别为INFO
    }
    else
    {
        /* 最好在此处断言getenv("LOG_LEVEL")的返回值一定是 "INFO" "ERROR" "DEBUG" "FATAL" */
        m_level = LogLevelStringType[getenv("LOG_LEVEL")];
    }
    /* m_logFile 暂不设置 */
}
Logger* Logger::GetInstance()
{
    static Logger logger;
    return &logger;
}
void Logger::SetLogToTerminal(bool logToTerminal)
{
    m_logToTerminal = logToTerminal;
}
bool Logger::GetLogToTerminal()const
{
    return m_logToTerminal;
}
void Logger::SetLogToLogFile(bool logToLogFile)
{
    m_logToLogFile = logToLogFile;
}
bool Logger::GetLogToLogFile()const
{
    return m_logToLogFile;
}
void Logger::SetLogFile(const std::string& logFileName)
{
    if(m_logFile.is_open())m_logFile.close();
    m_logFile.open(logFileName);
    m_logToLogFile = true;
}
void Logger::OffLogFile()
{
    if(m_logFile.is_open())m_logFile.close();
    m_logToLogFile = false;
}
void Logger::operator+=(const Message& msg)
{
    /* 打印到终端中，需要带颜色 */
    if(m_logToTerminal)
    {
        std::cout << msg.ToString(true) << std::endl;
    }
    /* 打印到日志文件中，不带颜色 */
    if(m_logToLogFile)
    {
        m_logFile << msg.ToString(false) << std::endl;
    }
    /* 如果在msg中找到了FATAL信息，则exit. 
     * std::string::npos 表示查找失败。!=表示 成功找到。
     */
    if(msg.ToString().find("FATAL") != std::string::npos)
    {
        std::cout << "fatal happened!" << std::endl;
        exit(-1);
    }
}
void Logger::SetLogLevel(LOG_LEVEL level)
{
    m_level = level;
}
LOG_LEVEL Logger::GetLogLevel() const
{
    return m_level;
}